Zendesk トリガーのバックアップをLambdaのイベント起動でS3保管してみました
ベルリンの半瀬です。久々の投稿です。
はじめに
変わらずZendeskの話題です。
チケットを特定の条件によって判別し、様々なアクションを実行させるZendeskの「トリガー」は、「お問い合わせ難易度に応じた担当者の割り当て」や「緊急度の判定」などを自動で行うことができ、クラスメソッド オペレーションチームに欠かせない機能となっています。
しかしその重要度に反し、設定ミスなどに備えたバックアップができていない状況でした。
というわけで、ひとまずlambdaで回して直近の設定を保管することにしました。
以下を参考。
やってみます
事前設定
curlを確認に利用しますので、こちらを参考に環境を準備します。
また、Zendesk APIキーも必要です。
こちらを見て準備しておきます。
APIの確認
既存トリガーの出力をしてみます。/api/v2/triggers.jsonを叩きます。
すると、以下のようにJSON形式の出力でつらつらと並びます。
# curl https://{subdomain}.zendesk.com/api/v2/triggers.json -v -u {email_address}/token:{api_token} | jq . ... { "triggers": [ { "url": "https://{subdomain}.zendesk.com/api/v2/triggers/{trigger_id}.json", "id": {trigger_id}, "title": "XXXXXX", "active": true, "updated_at": "2017-01-31T18:11:07Z", "created_at": "2017-01-16T12:41:27Z", "actions": [ { "field": "assignee_id", "value": "current_user" } ], "conditions": { "all": [ { "field": "update_type", "operator": "is", "value": "Change" }, { "field": "current_via_id", "operator": "is", "value": "email" }, { "field": "assignee_id", "operator": "is", "value": "" }, { "field": "role", "operator": "is_not", "value": "end_user" } ], "any": [] }, "position": {positon}, "raw_title": "XXXXXX" } ], "next_page": null, "previous_page": null, "count": 18 }
その他: アクティブなもののみを出力するなど
active.jsonをたたくと、アクティブなもののみ出力ができます。
# curl https://{subdomain}.zendesk.com/api/v2/triggers/active.json -v -u {email_address}/token:{api_token} | jq . ... (出力は割愛します)
また、トリガー同様に「自動化」に関しても、以下のAPIで得られます。
# curl https://{subdomain}.zendesk.com/api/v2/automations.json -v -u {email_address}/token:{api_token} | jq .
# curl https://{subdomain}.zendesk.com/api/v2/automations/active.json -v -u {email_address}/token:{api_token} | jq .
Lambda設定
上記のAPI出力結果をS3に保管します。以下のようなpythonスクリプトを用意します。
from __future__ import print_function import datetime import boto3 import os import requests from requests.auth import HTTPBasicAuth s3 = boto3.client('s3') # Zendesk ZEN_SUBDOMAIN = '<<Zendeskサブドメイン>>' ZEN_API_PATH = 'api/v2/triggers.json' ZEN_AUTHUSER = '<<API発行元管理者メールアドレス>>/token' ZEN_AUTHPASS = '<<APIトークン>>' # S3 S3_BUCKET = 'test-zendesk-export' def lambda_handler(event, context): now = datetime.datetime.now() URL = 'https://' + ZEN_SUBDOMAIN + '.zendesk.com/' + ZEN_API_PATH S3_KEY = now.strftime('%Y%m') + '/' + now.strftime('%d') + '/' + now.strftime('%Y%m%d%H%M%S') + '_triggers.json' response = requests.get(URL, auth=HTTPBasicAuth(ZEN_AUTHUSER, ZEN_AUTHPASS)) put = s3.put_object( Body=response.text, Bucket=S3_BUCKET, Key=S3_KEY )
S3バケット「test-zendesk-export(任意)」とS3アップロードのためのRoleを用意し、Lambdaを配置したらCloudwatch Events ルールで定期的に実行しておきます。
このスクリプトでは、出力はバケット配下に「年月/日/ファイル名.json」というような並びとなります。
また、必要に応じてS3ライフサイクルを決めておくと良いかと思います。
最後に
これで最低限のバックアップは用意できました。
管理更新をすべてjsonで行ないたいという展望はあるのですが、さしあたって簡単なところから攻めてみました。
次回以降で復旧や更新を確認していきたいと思います。
それではー。